//
// Created by ct on 2020/10/13.
//

#ifndef HTTPSERVER_CONNECTION_H
#define HTTPSERVER_CONNECTION_H

#include <array>
#include <memory>
#include <boost/asio.hpp>
#include "reply.h"
#include "request.h"
#include "request_handler.h"
#include "request_parser.h"

namespace http {
    namespace server {
        class connection_manager;

        /// 表示来自客户端的单个连接。
        class connection : public std::enable_shared_from_this<connection> {
        public:
            connection(const connection &) = delete;
            connection& operator=(const connection &) = delete;
        /// 用给定的套接字构造一个连接
        explicit connection(boost::asio::ip::tcp::socket socket,
                            connection_manager& manager, request_handler& handler);
        /// 启动连接的第一个异步操作。
        void start();
        /// 停止与连接关联的所有异步操作。
        void stop();

        private:
            /// 执行异步读取操作。
            void do_read();
            /// 执行异步写入操作。
            void do_write();
            /// 链接的socket
            boost::asio::ip::tcp::socket socket_;
            /// 此连接的管理器。
            connection_manager& connection_manager_;
            /// 用于处理传入请求的处理程序。
            request_handler& request_handler_;
            /// 传入数据的缓冲区。
            std::array<char, 8192> buffer_;

            /// 传入的请求。
            request request_;

            /// 传入请求的解析器
            request_parser request_parser_;

            /// 要发送回客户端的答复。
            reply reply_;
        };
        typedef std::shared_ptr<connection> connection_ptr;
    } // namespace server
} // namespace http





#endif //HTTPSERVER_CONNECTION_H
